﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using SIGCBI.Repository;
using Microsoft.Practices.Unity;

namespace SIGCBI.BusinessLogic
{
    public interface IProductoBL
    {
        List<PRODUCTO> GetAllFromProducto();
        List<PRODUCTO> GetFromProductoByDescripcion(string descripcion);
        List<PRODUCTO> GetAllFromProductosByDescripcionAndStockBajo(string descripcion, int minStock);
        PRODUCTO GetOneProductoByDescripcion(string codigo);
        PRODUCTO GetFromProductoById(Int32 id);
        void AddProducto(PRODUCTO producto);
        void UpdateProducto(PRODUCTO producto);
        void RemoveProducto(Int32 id);
        bool ExisteDuplicidadProdDescripcion(string codigo, string nombre, int ID);
    }

    public class ProductoBL :IProductoBL
    {
        [Dependency]
        public IProductoRepository productoRepository { get; set; }


        public List<PRODUCTO> GetAllFromProducto()
        {
            return productoRepository.GetAllFromProducto();
        }

        public List<PRODUCTO> GetFromProductoByDescripcion(string descripcion)
        {
            return productoRepository.GetFromProductoByDescripcion(descripcion);
        }

        public List<PRODUCTO> GetAllFromProductosByDescripcionAndStockBajo(string descripcion, int minStock)
        {
            return productoRepository.GetAllFromProductosByDescripcionAndStockBajo(descripcion, minStock);
        }

        public PRODUCTO GetOneProductoByDescripcion(string codigo)
        {
            return productoRepository.GetOneProductoByDescripcion(codigo);
        }

        public PRODUCTO GetFromProductoById(int id)
        {
            return productoRepository.GetFromProductoById(id); 
        }

        public void AddProducto(PRODUCTO producto)
        {
            var duplicidad = productoRepository.ExisteDuplicidadProdDescripcion(producto.Codigo, producto.Nombre, producto.ID);

            if (!duplicidad)
            {
                var msg = "";
                var ok = producto.Validate(out msg);

                if (ok)
                {
                    productoRepository.AddProducto(producto);                    
                }
                else
                {
                    throw new Exception(msg);
                }
            }
            else
            {
                var error = string.Format("Ya existe un producto con la misma información\n" +
                    "Código: " + producto.Codigo + "\nNombre: " + producto.Nombre);
                throw new Exception(error);
            }     
        }

        public void UpdateProducto(PRODUCTO producto)
        {
            var duplicidad = productoRepository.ExisteDuplicidadProdDescripcion(producto.Codigo, producto.Nombre, producto.ID);

            if (!duplicidad)
            {
                var msg = "";
                var ok = producto.Validate(out msg);
                if (ok)
                {
                    productoRepository.UpdateProducto(producto);
                }
                else
                {
                    throw new Exception(msg);
                }
            }
            else
            {
                var error = string.Format("Ya existe un producto con la misma información\n" +
                    "Código: " + producto.Codigo + "\nNombre: " + producto.Nombre);
                throw new Exception(error);
            }
        }

        public void RemoveProducto(int id)
        {
            var hijos = false; // historialDAO.GetAllHistorialByProductoId(id);

            if (hijos == true)
            {
                var error = string.Format("No se puede eliminar el Producto ");
                throw new Exception(error);
            }
            else
            {
                productoRepository.RemoveProducto(id);
            }
        }

        public bool ExisteDuplicidadProdDescripcion(string codigo, string nombre, int ID)
        {
            return productoRepository.ExisteDuplicidadProdDescripcion(codigo, nombre, ID);
        }
    }
}
